/**
 * 计算字符串的简单哈希值，并将结果转换为36进制字符串，截取前6位返回。
 *
 * 该函数使用简单的哈希算法，通过对字符串中每个字符的Unicode编码进行计算得到哈希值。
 *
 * @param {string} str - 待计算哈希值的字符串。
 *
 * @returns {string} 36进制表示的哈希值，长度为6的字符串。
 */
function vectorSimpleHash(str) {
	/**
	 * 计算字符串的简单哈希值
	 */
	let hash = 0;
	// 遍历字符串中的每个字符
	for (let i = 0; i < str.length; i++) {
		/**
		 * 获取当前字符的Unicode编码
		 */
		const char = str.charCodeAt(i);
		// 计算哈希值
		hash = ((hash << 5) - hash) + char;
	}
    // 取哈希值的绝对值，转换为36进制字符串，填充到6位长度，最后截取前6位
    return Math.abs(hash).toString(36).padStart(6, '0').slice(0, 6);
};

/**
 * 根据给定的角色、段落内容、索引、起始和结束位置生成段键。
 *
 * @param {string} role - 角色标识。
 *
 * @param {string} segment - 段落内容。
 *
 * @param {number} index - 段索引。
 *
 * @param {number} start - 起始位置。
 *
 * @param {number} end - 结束位置。
 *
 * @returns {string} 生成的段键。
 */
function vectorMakeSegmentKey(role, segment, index, start, end) {
	/**
	 * 计算段落内容的简单哈希值
	 */
	const hash = vectorSimpleHash(segment);
	/**
	 * 截取段落内容的前60个字符，将冒号替换为分号，多个空白字符替换为单个空格，并去除首尾空白
	 */
	const prefix = segment.slice(0, 60).replace(/:/g, ';').replace(/\s+/g, ' ').trim();
	// 拼接并返回段键
	return `${role}:${hash}_seg${index}[${start}-${end}]:${prefix}`;
};